package com.zhou.org.service;

import com.zhou.org.dao.Org;
import com.baomidou.mybatisplus.extension.service.IService;
import com.zhou.org.dao.OrgRelation;
import com.zhou.org.dao.User;
import com.zhou.org.dto.OrgDragDto;
import com.zhou.org.dto.OrgDto;
import com.zhou.org.dto.OrgQueryDto;
import com.zhou.org.dto.OrgRelationDelDto;
import com.zhou.org.model.OrgTree;

import java.util.List;
import java.util.Map;

/**
 * <p>
 *  服务类
 * </p>
 *
 * @author lang.zhou
 * @since 2022-08-23
 */
public interface OrgService extends IService<Org> {
    /**
     * 查询orgid下的组织结构对象
     */
    List<OrgTree> getPageList(OrgQueryDto dto);
    List<OrgTree> getOrgList(OrgQueryDto dto);
    List<OrgTree> getChildrenList(OrgQueryDto dto);
    List<Map<String,Object>> getDepartmentTree(Map<String,Object> map);

    /**
     * 递归查询orgid下面的所有子节点
     */
    List<OrgTree> getChildOrgObject(int orgId);

    /**
     * 获取角色列表
     */
    List<Org> getRoles();
    List<Map<String, Object>> getOrgTreeByTypeList(Map<String,Object> map,List<Integer> orgTypes);

    User getUserByOrgId(Integer orgId);

    /**
     * 保存组织结构
     */
    Org saveOrg(OrgDto dto);

    /**
     * 保存角色
     */
    void saveRole(Org org);
    void saveDragOrg(OrgDragDto dto);

    /**
     * 添加用户组织结构关系
     */
    void addOrgRelation(List<OrgRelation> data);

    /**
     * 批量删除组织架构对象
     */
    void deleteOrg(List<Integer> ids);
    /**
     * 删除用户组织结构关系
     */
    void deleteOrgRelation(OrgRelationDelDto dto);
    void deleteOrgRelation(int fromId, int toId);

    /**
     * 返回克隆的组织架构缓存
     */
    List<OrgTree> getMainTree();
    List<OrgTree> getOrgTree(int orgType);
    List<Integer> findChildDistinctUserId(int orgId);
    List<Integer> getChildDistinctUserOrgId(int orgId);
    /**
     * 查询所有的父节点
     */
    List<Integer> getAllParentOrgId(int orgId);
    /**
     * 查询出一个组织结构下所有的用户
     */
    List<User> findChildDistinctUser(int orgId);
    /**
     * 查询出一个组织结构下所有的用户
     */
    List<User> getChildDistinctUserByOrgType(int orgType,int orgId);
    /**
     * 查询orgid所有父节点
     */
    List<OrgTree> getParentOrgObject(int orgId);

    /**
     * 找到直属上级部门缓存
     */
    List<OrgTree> findLatestParentCache(int orgId);

    /**
     * 查询orgid所有父节点
     */
    OrgTree getOrgObject(int orgId);

    /**
     * 缓存中查询对象
     */
    OrgTree findOrgObject(Integer orgId);
    List<Org> getOrgObjects(List<Integer> orgIds);

    void refreshCache();

    /**
     * 获得完整树形结构
     */
    List<OrgTree> getCacheTree();
    /**
     * 获得拥有树形结构的用户id
     */
    List<Integer> getOrgUser();
}
